{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Syft Keras দিয়ে প্রাইভেট প্রেডিকশান  (Private Predictions with Syft Keras)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## ধাপ - ৩ঃ Syft Keras দিয়ে প্রাইভেট প্রেডিকশান - সারভিং (ক্লায়েন্ট)  (Private Prediction using Syft Keras - Serving (Client)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "অভিনন্দন! আপনার মডেলটিকে সাধারণ Keras দিয়ে ট্রেইন করে এবং এটি Syft Keras দিয়ে সুরক্ষিত করার পরে, আপনি কিছু প্রাইভেট প্রেডিকশান এর রিকুয়েস্ট করতে প্রস্তুত।"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "অনুবাদক:\n",
    "\n",
    "- Sourav Das - Twitter: [@adventuroussrv](https://twitter.com/adventuroussrv)\n",
    "- Zarreen Reza - Twitter: [@zarreennreza](https://twitter.com/zarreennreza)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "from tensorflow.keras.datasets import mnist\n",
    "\n",
    "import syft as sy"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## ডেটা (Data)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "এখানে, আমরা আমাদের MNIST ডেটাকে প্রাক-প্রক্রিয়াজাত (preprocessed) করি। এটি আমরা মডেল ট্রেইনের সময় যেভাবে প্রাক-প্রক্রিয়াজাত (preprocessed) করি সেই অনুরূপ।"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# input image dimensions\n",
    "img_rows, img_cols = 28, 28\n",
    "\n",
    "# the data, split between train and test sets\n",
    "(x_train, y_train), (x_test, y_test) = mnist.load_data()\n",
    "\n",
    "x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)\n",
    "x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)\n",
    "input_shape = (img_rows, img_cols, 1)\n",
    "\n",
    "x_train = x_train.astype('float32')\n",
    "x_test = x_test.astype('float32')\n",
    "x_train /= 255\n",
    "x_test /= 255"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## মডেলটি সংযুক্ত করুন (Connect to model)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "মডেলটি থেকে ক্যুয়েরি করার আগে মডেলটি সংযুক্ত করতে হবে। এটি করার জন্য আপনি একটি ক্লায়েন্ট তৈরি করতে পারেন। তারপর ঠিক একইরকম তিনটি TFEWorkers (alice, bob ও carol) এবং একটি ক্লাস্টার নির্ধারণ করুন। সবশেষে connect_to_model কল করুন। এটি ক্লায়েন্ট সাইডে একটি TFE সারিবদ্ধকারি (queueing)   সার্ভার তৈরি করে যা পর্ব-১৩বি এর model.serve() দ্বারা সারিবদ্ধকারি (queueing) সার্ভার সেটআপ এর সাথে সংযুক্ত হয়। এই ক্যুটি (queue)  প্লেইন টেক্সট ডেটাকে সুরক্ষিতভাবে বিভিন্ন শেয়ারে প্রেডিকশান রিকুয়েস্টে পাঠানোর দায়িত্বে থাকবে।"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "num_classes = 10\n",
    "input_shape = (1, 28, 28, 1)\n",
    "output_shape = (1, num_classes)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO:tf_encrypted:Starting session on target 'grpc://localhost:4000' using config graph_options {\n",
      "}\n",
      "\n"
     ]
    }
   ],
   "source": [
    "client = sy.TFEWorker()\n",
    "\n",
    "alice = sy.TFEWorker(host='localhost:4000')\n",
    "bob = sy.TFEWorker(host='localhost:4001')\n",
    "carol = sy.TFEWorker(host='localhost:4002')\n",
    "cluster = sy.TFECluster(alice, bob, carol)\n",
    "\n",
    "client.connect_to_model(input_shape, output_shape, cluster)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## মডেল থেকে ক্যুয়েরি করা (Query model)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "আপনি কিছু প্রাইভেট প্রেডিকশান পেতে প্রস্তুত! Query_model কল করার মাধ্যমে ইমেজটি উপরে তৈরি সারিতে (queue) সংযুক্ত হবে, ডেটা গোপনীয়তার সাথে  স্থানীয়ভাবে  (locally) শেয়ার হবে, এবং শেয়ারকৃত ভাগগুলো পর্ব-১৩বি এর মডেল সার্ভারে জমা দিবে।"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "# User inputs\n",
    "num_tests = 3\n",
    "images, expected_labels = x_test[:num_tests], y_test[:num_tests]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The image had label 7 and was correctly classified as 7\n",
      "The image had label 2 and was correctly classified as 2\n",
      "The image had label 1 and was correctly classified as 1\n"
     ]
    }
   ],
   "source": [
    "for image, expected_label in zip(images, expected_labels):\n",
    "\n",
    "    res = client.query_model(image.reshape(1, 28, 28, 1))\n",
    "    predicted_label = np.argmax(res)\n",
    "\n",
    "    print(\"The image had label {} and was {} classified as {}\".format(\n",
    "        expected_label,\n",
    "        \"correctly\" if expected_label == predicted_label else \"wrongly\",\n",
    "        predicted_label))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "অসাধারণ! আপনি এই তিনটি চিত্রকে সঠিকভাবে শ্রেণিবদ্ধ করতে সক্ষম হয়েছেন! তবে এই প্রেডিকশানগুলোর বৈশিষ্ট্য হচ্ছে এই পরিষেবাটি পাওয়ার জন্য আপনি কোনও ব্যক্তিগত তথ্য প্রকাশ করেন নি। মডেল হোস্ট আপনার ইনপুট ডেটা বা আপনার প্রেডিকশান কখনো দেখেনি এবং আপনি কখনও মডেলটি ডাউনলোড করেন নি। আপনি একটি এনক্রিপ্টেড মডেল ব্যবহার করে এনক্রিপ্টেড ডেটার উপর প্রাইভেট প্রেডিকশান পেতে সফল হয়েছেন!\n",
    "\n",
    "এটি আমাদের নিজস্ব অ্যাপ্লিকেশনগুলিতে প্রয়োগ করার আগে, আমাদের সার্ভ করা মডেলটি মুছে ফেলতে দ্রুত পর্ব-১৩বি তে ফিরে যাই!"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.17"
  },
  "nbTranslate": {
   "displayLangs": [
    "*"
   ],
   "hotkey": "alt-t",
   "langInMainMenu": true,
   "sourceLang": "en",
   "targetLang": "fr",
   "useGoogleTranslate": true
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
